package com.wwj.aicodemother.core.saver;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import com.wwj.aicodemother.constant.AppConstant;
import com.wwj.aicodemother.exception.BusinessException;
import com.wwj.aicodemother.exception.ErrorCode;
import com.wwj.aicodemother.model.enums.CodeGenTypeEnum;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 抽象代码文件保存器-模板方法模式
 * @param <T>
 */
public abstract class CodeFileSaverTemplate<T>{

    //文件保存根目录
    private static final String FILE_SAVE_ROOT_DIR = AppConstant.CODE_OUTPUT_ROOT_DIR;

    /**
     * 模板方法,保存代码的标准流程
     * @param result
     * @param appId 应用ID
     * @return
     */
    public final File saveCode(T result,Long appId){
        //1.验证输入
        validateInput(result);
        //2.构建唯一目录
        String baseDirPath = buildUniqueDir(appId);
        //3.保存文件(具体实现交给子类)
        saveFile(result,baseDirPath);
        //4.返回文件目录对象
        return new File(baseDirPath);
    }

    /**
     * 验证输入参数
     * @param result
     */
    protected void validateInput(T result) {
        if(result == null){
            throw new BusinessException(ErrorCode.SYSTEM_ERROR,"入参不能为空");
        }
    }

    /**
     * 构建文件唯一路径(tmp/code_output/bizType_雪花ID)
     *
     * @param appId 应用ID
     * @return 目录路径
     */
    private String buildUniqueDir(Long appId) {
        if(appId == null){
            throw new BusinessException(ErrorCode.SYSTEM_ERROR,"appId不能为空");
        }
        String codeType = getCodeType().getValue();
        String unqiueDirName = StrUtil.format("{}_{}",codeType , appId);
        String dirPath = FILE_SAVE_ROOT_DIR + File.separator +unqiueDirName;
        FileUtil.mkdir(dirPath);
        return dirPath;
    }

    /**
     * 保存单个文件方法
     * @param dirPath
     * @param fileName
     * @param content
     */
    public final void writeToFile(String dirPath, String fileName ,String content) {
        if (StrUtil.isNotBlank(content)){
            String filePath = dirPath + File.separator + fileName;
            FileUtil.writeString(content,filePath, StandardCharsets.UTF_8);
        }
    }

    /**
     * 获得代码生成类型
     * @return
     */
    protected abstract CodeGenTypeEnum getCodeType();

    /**
     * 保存文件(集体实现交给子类)
     * @param result
     * @param baseDirPath
     */
    protected abstract void saveFile(T result, String baseDirPath) ;

}
